\chapter{Introduction}

\section{De l'art de l'enseignement de la programmation}

Quelle est la meilleure façon d'apprendre à programmer ? Sur cette question essentielle, les avis divergent. De nombreux professeurs réfléchissent chaque année sur la manière d'améliorer leur enseignement. Peu importe l'efficacité d'une méthode, celle-ci reste toujours perfectible. En revanche, de nombreux enseignants pensent que la clé pour devenir un bon programmeur est la pratique. Par conséquent, nombres d'entre eux sont favorables à l'insertion de projets, individuels ou par groupes d'étudiants, dans les formations en informatique. Il reste néanmoins difficile de mettre en place un suivi efficace. Pour se faire, il faudrait que les étudiants puissent avoir un retour sur l'avancement de leur projet aussi souvent que possible. Du coté de l'enseignant, le fait qu'un grand nombre de groupes lui soit affecté réduit considérablement son temps de disponibilité pour chacun d'entre eux.

\section{Une aide aux étudiants et aux enseignants}

Le programme SPASS est une plateforme de support pour étudiants et enseignants.
Cette plateforme permet avant toute chose de soumettre des projets avec certaines contraintes (dates, types de fichiers, etc...).
Elle permet également d'effectuer des tests de manières automatiques sur les différents projet soumis.
Enfin, elle permet de centraliser les projets finaux qui seront mis à la disposition de l'enseignant référent.

Ainsi, les étudiants peuvent, tout au long du projet, soumettre leurs productions courantes à une batterie de tests définis par l'enseignant. Cela leur permet alors d'avoir une appréciation de leur travail et des pistes sur les points qui restent perfectibles.

Pour l'enseignant, cela lui permet de tester les programmes de ses étudiants de manière automatisée afin d'obtenir un aperçu de la qualité du travail de ceux-ci. Il peut également effectuer des comparaisons entre programmes similaires afin d'évaluer les groupes les uns par rapport aux autres. Il gagne donc en rapidité de correction.


\section{Difficultés}
Les systèmes automatisés ont notamment été créés dans le but d'assister l'être humain dans sa décision
\footnote{Ce que l'on appelle de l'\emph{Aide décisionnelle}}. Dans notre projet, une des difficultés réside sur la manière de noter ou de classer un (ou plusieurs) logiciel(s) selon différents critères de façon automatique, ou du moins semi-automatique.

Évaluer la qualité d'un logiciel a toujours été un problème difficile à définir, du fait du nombre très important de tests qui existent, et de l'importance relative à donner à chacun de ces test. Pour aider à évaluer cette qualité, notre projet fournira une manière simple de configurer (système de pondération) tous les tests qui seront mis à disposition. De manière plus formelle, il a été prouvé qu'analyser un programme (incluant tous les états, résultats et erreurs possibles) est un problème indécidable. Il n'existe pas de méthode automatisée qui puisse répondre sans se tromper si un programme peut ou non produire des erreurs à l'exécution
\footnote{Ces résultats datent des travaux effectués par Church, Gödel et Turing dans les années 1930}.


Voyons plus en détail les différentes classes de test qui existent\cite{Pre96}.

\subsection{Analyse statique}

\subsubsection{Définition}
L'analyse de code statique est l'analyse d'un logiciel sans exécution réelle du programme. Dans la plupart des cas, l'analyse est effectuée directement sur le code source du programme et dans les autres cas sur du \emph{code objet}
\footnote{Fichier intermédiaire intervenant dans le processus de compilation}.

\subsubsection{Types de tests statiques}

\begin{itemize}
\item \textbf{Les \emph{Lectures croisées} et l'\emph{inspection}}
\end{itemize}

Le but de ces deux approches et de donner un point de vue différent et surtout indépendant de l'auteur sur du code source ou des spécifications, afin de minimiser les erreurs d'interprétation.

Les lectures croisées consistent à faire lire à plusieurs personnes, mais de manière individuelle, le code source (ou partie du source, comme des modules) du programme en test.
Quant à l'inspection, elle consiste en une relecture en groupe, après une préparation individuelle, et selon des règles et un protocole précis.

De par sa nature, il est trivial d'affirmer qu'il n'existe pas de système automatisé (un autre programme par exemple) qui effectue ce type de test. Ce test ne sera donc pas inclus dans SPASS.\\


\begin{itemize}
\item \textbf{\emph{Analyse d'anomalies}}
\end{itemize}

Ce type d'analyse est faite à la compilation (mais toujours sans exécuter le programme). Elle a pour but de détecter toutes sortes de violations de règles propre au langage de programmation (utilisé dans le programme en test), comme les règles de typage, l'utilisation impropre de pointeurs, la présence de variables ayant une valeur strictement constante, le défaut de portabilité, la déclaration d'arguments ou de bibliothèques jamais utilisés, etc...
Dans notre projet, il s'agira typiquement d'analyser la sortie standard du programme de compilation. Comme par exemple pour \emph{GCC}, il s'agira de détecter, classer et compter les erreurs/avertissements de compilation, et d'en tenir compte pour la classification/notation du programme en test.\\


\begin{itemize}
\item \textbf{L'\emph{Évaluation symbolique}}
\end{itemize}

L'évaluation symbolique crée des expressions symboliques qui relient les données en entrée à celles de sorties ainsi que toutes les conditions, pour suivre un certain chemin lors de l'exécution. Ce type d'analyse permet, à partir des expressions symboliques calculées, de réduire grâce à des règles de réduction la complexité d'une partie du code source (d'une fonction par exemple) d'un programme.
Cette évaluation a donc pour but d'aider le concepteur à améliorer l'efficacité de son algorithme/programme, et ne donne aucunes informations propres sur le programme (comme c'est le cas pour l'\emph{analyse d'anomalies}). Ce test ne sera donc pas inclus dans SPASS (le but de SPASS n'étant pas de donner des indications d'amélioration, mais d'établir une notation selon certains critères).

\subsection{Analyse dynamique}

\subsubsection{Définition}
L'analyse dynamique est l'analyse d'un logiciel par l'exécution des programmes compilés à partir de ce logiciel sur un processeur réel ou virtuel. Pour que l'analyse dynamique de programme soit efficace, le programme cible doit être exécuté avec des entrées de test suffisantes pour produire un comportement intéressant.

\subsubsection{Types de tests dynamiques}

\begin{itemize}
\item \textbf{Le \emph{test structurel}}
\end{itemize}

Le test structurel utilise la description de la structure du logiciel soumis pour définir un jeu de test utilisant spécifiquement cette structure. Le test structurel utilisera soit le graphe de contrôle (graphe définissant chaque chemin logique entre chaque bloc d'instruction), soit le flot de données (défini par l'ensemble des données manipulées, comme les variables, structures de contrôles, flux, etc...).
Dans le premier cas, le test structurel sera défini par des critères de couverture du graphe de contrôle. Dans le deuxième cas, les critères seront défini directement sur le flot de données.

\emph{\textbf{Exemple de test structurel pour un solveur de sudoku :}
Lui donner en entrée une matrice déjà résolue, pour analyser spécifiquement les chemins du graphe de contrôle utilisés en cas de matrice résolue (l'a-t-il détecté de suite ? ou a-t-il d'abord essayé de résoudre la grille ?)}.\\


\begin{itemize}
\item \textbf{Le \emph{test fonctionnel}}
\end{itemize}

Le test fonctionnel utilise la description de la fonctionnalité du logiciel en test pour définir un jeu de test utilisant spécifiquement cette fonctionnalité.

\emph{\textbf{Exemple de test fonctionnel pour un solveur de sudoku :}
Lui donner en entrée une matrice partiellement vide, pour analyser sa capacité à résoudre le sudoku (l'a-t-il bien rempli ? de manière correcte ? en combien de temps ?)}.\\


\begin{itemize}
\item \textbf{Le \emph{test aléatoire}}
\end{itemize}

Les méthodes de test aléatoire utilisent un jeu de test qui sont obtenus par tirage selon une loi de probabilité. Ce test n'est donc par définition, ni structurel, ni fonctionnel.

\emph{\textbf{Exemple de test fonctionnel pour un solveur de sudoku :}
Lui donner en entrée une matrice partiellement vide avec des cases remplies de chiffres purement aléatoires compris entre 0 et 100, et analyser son comportement (va-t-il planter ? va-t-il détecter une anomalie ?)}.

\paragraph*{}

\textbf{Utilisation de ces test dans SPASS :}\\

Les tests dynamiques seront typiquement écrits directement par l'utilisateur avec l'API fournie. Ce sera à l'utilisateur d'écrire son propre programme de test dynamique, pour mettre en avant des aspects selon ses choix. Des fonctions pour le profilage (utilisation mémoire, temps d'exécution, etc...) seront disponibles dans l'API.

Quant aux test statiques, ils seront implémentés dans SPASS, et utilisables par l'utilisateur via l'API fournie.


\section{Intérêts pédagogiques}

D'un point de vue pédagogique, la plateforme a plusieurs intérêts.

\subsection{L'évaluation}

La plupart des informaticiens sont d'accord pour dire que la programmation est plus un art qu'une science exacte. Il est donc complexe, et ce malgré le nombre de tests utilisés, de noter un code source de manière entièrement automatique. Le plateforme n'a en aucun cas pour prétention de fournir une note en sortie. Les résultats des différents tests fourniront donc des indications sur des points particuliers qui aideront l'enseignant dans son appréciation du projet.


\subsection{La comparaison}

La comparaison entre programmes est également difficile. En effet, celle-ci se base sur plusieurs points qui n'ont pas forcément la même importance en fonction du travail demandé et de l'enseignant. Les tests auront donc une pondération, défini par l'enseignant, de manière à privilégier certaines qualités par rapport à d'autres.


\subsection{Impact pour les étudiants}

Les étudiants, grâce à la plateforme, auront la possibilité d'avoir un suivi continu et des indications sur l'état de leur travail.
Cela leur permettra à la fois, de gagner en efficacité mais aussi en autonomie.
